#include "STM32_Flush.h"
char usrname[16];		// 写在局部局部变量，ESP不一定发现
char passwd[16];

// addr: 页首地址
void erasePage(uint32_t addr) {
    FLASH_Unlock();					//解锁
    FLASH_ErasePage(addr);			//页擦除
    FLASH_Lock();					//加锁
}

// addr: 页首地址
// data: 存放在首地址的32位数据
void changeFlashFor32(uint32_t addr, uint32_t data) {
    FLASH_Unlock();							// 解锁
    FLASH_ProgramWord(addr, data);			// 32bits
    FLASH_Lock();							// 加锁
}

// addr: 页首地址
// data: 存放在首地址的16位数据
void changeFlashFor16(uint32_t addr, uint16_t data) {
    FLASH_Unlock();							// 解锁
    FLASH_ProgramHalfWord(addr, data);		// 16bits
    FLASH_Lock();							// 加锁
}

// 读取数据
void readFlash(uint32_t addr, char *buffer, int len) {
    for (int i = 0; i < len; i++) {
        buffer[i] = *(__IO uint8_t *)(addr + i);
    }
}

//void Get_Info(char* buffer){
////		sscanf(buffer, "!%[^=]=%[^!]", usrname, passwd);	// 这个好像没能分配正确
//		
//		char* begin = strtok(buffer, "!");;
//		strcpy(usrname, strtok(begin, "="));     	  // 第一次分割，得到 "yang"
//		strcpy(passwd, strtok(NULL, "!")); 			  // 第二次分割，得到 "12345678"
//		
//		// 发现怎么debug都有错，原来竟然是输出测试写错了，已经郁闷坏了...
////		// 处理usrname：如果首字符是!，则整体前移
////		if(usrname[0] == '!') {
//////			for(int i = 0; i < strlen(usrname) - 1; i++){
//////				c = usrname[i + 1];
//////			}
////			memmove(usrname, usrname+1, strlen(usrname)); // 包括'\0'一起移动
//////			usrname[strlen(usrname) - 1] = '\0';
////		}
////		
////		USART_printf(&USART1_Cfg, "[TEST]stm32flush.c line49, usrname[0]: %c, usrname[1]: %c, usrname[2]: %c\r\n", usrname[0], usrname[1], usrname[2]);

////		// 处理passwd：如果末字符是!，则截断
////		size_t pwd_len = strlen(passwd);
////		if(pwd_len > 0 && passwd[pwd_len-1] == '!') {
////			passwd[pwd_len-1] = '\0';
////		}
//		
////		strcpy(usrname, strtok("!", "="));     	  	  // 第一次分割，得到 "yang"
////		strcpy(passwd, strtok(NULL, "!")); 			  // 第二次分割，得到 "12345678"
//		
////		strtok(NULL, "!");
////		strcpy(usrname, strtok(NULL, "="));     	  // 第一次分割，得到 "yang"
////		strcpy(passwd, strtok(NULL, "!")); 			  // 第二次分割，得到 "12345678"
//}

void Read_Flash_Code(void) {
    uint32_t address = 0x0800F000;
    int status = 0;
    char buffer[128] = {0};

    status = *((__IO uint32_t *)(address));	 // 读取 0x0800F000 处的32位值

    if (status != 0xFFFFFFFF) {		
        // 有内容
        int len = *((__IO uint32_t *)(address + 4));
        readFlash(address + 8, buffer, len);
        
        // 使用独立缓冲区拼接（解决覆盖问题）
		snprintf(buffer, sizeof(buffer), "%s\r\n", buffer);
		USART_SendString(&USART1_Cfg, (const unsigned char*)buffer, strlen(buffer));
		
//		USART_printf(&USART1_Cfg, "[TEST]stm32flush.c line49, %s\r\n", buffer);
		
//		Get_Info(buffer);
		

		char* begin = strtok(buffer, "!");;
		strcpy(usrname, strtok(begin, "="));     	  // 第一次分割，得到 "yang"
		strcpy(passwd, strtok(NULL, "!")); 			  // 第二次分割，得到 "12345678"

		USART_printf(&USART1_Cfg, "[TEST]stm32flush.c line53, usrname: %s, passwd: %s\r\n", usrname, passwd);
//		while(1);
		
    } else {
        // Flash无内容, 存入数据
        char *str = "!yang=12345678!";
        strncpy(buffer, str, strlen(str) + 1);
		buffer[sizeof(buffer) - 1] = '\0';  // 强制终止

        erasePage(address);
        changeFlashFor32(address, 14);
        changeFlashFor32(address + 4, strlen(buffer));

        for (int i = 0; i < sizeof(buffer); i += 4) {
            changeFlashFor32(address + 8 + i, *(int *)(buffer + i));
        }

		USART_printf(&USART1_Cfg, "write \r\n");
    }
}
